/* *
 *
 *  !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
 *
 * */
'use strict';
import H from '../../parts/Globals.js';
import U from '../../parts/Utilities.js';

var merge = U.merge;
var Annotation = H.Annotation, MockPoint = Annotation.MockPoint, InfinityLine = Annotation.types.infinityLine;
/* eslint-disable no-invalid-this, valid-jsdoc */
var Pitchfork = function () {
    InfinityLine.apply(this, arguments);
};
Pitchfork.findEdgePoint = function (point, firstAnglePoint, secondAnglePoint) {
    var angle = Math.atan2(secondAnglePoint.plotY - firstAnglePoint.plotY, secondAnglePoint.plotX - firstAnglePoint.plotX),
        distance = 1e7;
    return {
        x: point.plotX + distance * Math.cos(angle),
        y: point.plotY + distance * Math.sin(angle)
    };
};
Pitchfork.middleLineEdgePoint = function (target) {
    var annotation = target.annotation, points = annotation.points;
    return InfinityLine.findEdgePoint(points[0], new MockPoint(annotation.chart, target, annotation.midPointOptions()));
};
var outerLineEdgePoint = function (firstPointIndex) {
    return function (target) {
        var annotation = target.annotation, points = annotation.points;
        return Pitchfork.findEdgePoint(points[firstPointIndex], points[0], new MockPoint(annotation.chart, target, annotation.midPointOptions()));
    };
};
Pitchfork.topLineEdgePoint = outerLineEdgePoint(1);
Pitchfork.bottomLineEdgePoint = outerLineEdgePoint(0);
H.extendAnnotation(Pitchfork, InfinityLine, {
        midPointOptions: function () {
            var points = this.points;
            return {
                x: (points[1].x + points[2].x) / 2,
                y: (points[1].y + points[2].y) / 2,
                xAxis: points[0].series.xAxis,
                yAxis: points[0].series.yAxis
            };
        },
        addShapes: function () {
            this.addLines();
            this.addBackgrounds();
        },
        addLines: function () {
            this.initShape({
                type: 'path',
                points: [
                    this.points[0],
                    Pitchfork.middleLineEdgePoint
                ]
            }, false);
            this.initShape({
                type: 'path',
                points: [
                    this.points[1],
                    Pitchfork.topLineEdgePoint
                ]
            }, false);
            this.initShape({
                type: 'path',
                points: [
                    this.points[2],
                    Pitchfork.bottomLineEdgePoint
                ]
            }, false);
        },
        addBackgrounds: function () {
            var shapes = this.shapes, typeOptions = this.options.typeOptions;
            var innerBackground = this.initShape(merge(typeOptions.innerBackground, {
                type: 'path',
                points: [
                    function (target) {
                        var annotation = target.annotation, points = annotation.points,
                            midPointOptions = annotation.midPointOptions();
                        return {
                            x: (points[1].x + midPointOptions.x) / 2,
                            y: (points[1].y + midPointOptions.y) / 2,
                            xAxis: midPointOptions.xAxis,
                            yAxis: midPointOptions.yAxis
                        };
                    },
                    shapes[1].points[1],
                    shapes[2].points[1],
                    function (target) {
                        var annotation = target.annotation, points = annotation.points,
                            midPointOptions = annotation.midPointOptions();
                        return {
                            x: (midPointOptions.x + points[2].x) / 2,
                            y: (midPointOptions.y + points[2].y) / 2,
                            xAxis: midPointOptions.xAxis,
                            yAxis: midPointOptions.yAxis
                        };
                    }
                ]
            }));
            var outerBackground = this.initShape(merge(typeOptions.outerBackground, {
                type: 'path',
                points: [
                    this.points[1],
                    shapes[1].points[1],
                    shapes[2].points[1],
                    this.points[2]
                ]
            }));
            typeOptions.innerBackground = innerBackground.options;
            typeOptions.outerBackground = outerBackground.options;
        }
    },
    /**
     * A pitchfork annotation.
     *
     * @sample highcharts/annotations-advanced/pitchfork/
     *         Pitchfork
     *
     * @extends      annotations.infinityLine
     * @product      highstock
     * @optionparent annotations.pitchfork
     */
    {
        typeOptions: {
            /**
             * Inner background options.
             *
             * @extends   annotations.crookedLine.shapeOptions
             * @excluding height, r, type, width
             */
            innerBackground: {
                fill: 'rgba(130, 170, 255, 0.4)',
                strokeWidth: 0
            },
            /**
             * Outer background options.
             *
             * @extends   annotations.crookedLine.shapeOptions
             * @excluding height, r, type, width
             */
            outerBackground: {
                fill: 'rgba(156, 229, 161, 0.4)',
                strokeWidth: 0
            }
        }
    });
Annotation.types.pitchfork = Pitchfork;
export default Pitchfork;
